﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Web.Services;
using System.Web.UI;
using App_Code.Clases;
using App_Code.Utilidades;
using SubSonic.Repository;

public partial class Usuario_VerPerfil : Page
{
    static readonly SimpleRepository repository = new SimpleRepository("Electro",SimpleRepositoryOptions.None);
    protected void Page_Load(object sender, EventArgs e)
    {
        Validaciones.ValidarSession();
        if(!Page.IsPostBack)
        {
           /* var idSolicitado = int.Parse(Request.Params[0]);
            if(idSolicitado==SesionUsuario.UsuarioSesion.IdUsuario)
            {*/
                idPerfil.Value = SesionUsuario.UsuarioSesion.IdPerfil.ToString();
                
                var perfilUsuario = repository.Single<Perfil>(SesionUsuario.UsuarioSesion.IdPerfil);
                if(perfilUsuario!=null)
                {
                    spNombre.InnerText = perfilUsuario.Nombre;
                    spApellidos.InnerText = perfilUsuario.Apellido;
                    spCelular.InnerText = perfilUsuario.Celular;
                    spDUI.InnerText = perfilUsuario.DUI;
                    spFijo.InnerText = perfilUsuario.Telefono;
                    spNIT.InnerText = perfilUsuario.NIT;
                    spOtros.InnerText = perfilUsuario.Otros;
                    
                }

            var direcciones = new List<DireccionCliente>();
            var cuentas = new List<Cuenta>();
            var cliente = repository.Single<Cliente>(x => x.IdPerfil == SesionUsuario.UsuarioSesion.IdPerfil);
            if(cliente!=null)
            {
                direcciones = (from d in repository.All<DireccionCliente>()
                               where d.IdCliente == cliente.Id
                               select d).ToList();
                cuentas = (from c in repository.All<Cuenta>()
                           where c.IdCliente == cliente.Id
                           select c).ToList();
            }
            GridDirecciones.DataSource = direcciones;
            GridDirecciones.DataBind();

            GridCuenta.DataSource = cuentas;
            GridCuenta.DataBind();
            //}
        }
    }

    [WebMethod]
    public static object ObtenerPerfil(int idPerfil)
    {
        try
        {
            var perfil = repository.Single<Perfil>(idPerfil);
            return new
                       {
                           perfil.Apellido,
                           perfil.Celular,
                           perfil.DUI,
                           perfil.NIT,
                           perfil.Nombre,
                           perfil.Otros,
                           perfil.Telefono,
                           Correcto=true
                       };
        }
        catch(Exception ex)
        {
            return new { Correcto = false,Message="Ha ocurrido un error:\n"+ex.Message};
        }
        
    }
    [WebMethod]
    public static object GuardarPerfil(bool esNuevo,string apellidos,string celular,string dui,string nit,string nombre,string otros,string fijo)
    {
        try
        {
            Perfil perfil;
            var mensajeError = "";
            var pasado = true;
            if (string.IsNullOrEmpty(apellidos))
            {
                pasado = false;
                mensajeError += "\nApellidos";
            }
            if (string.IsNullOrEmpty(dui))
            {
                pasado = false;
                mensajeError += "\nDUI";
            }
            if (string.IsNullOrEmpty(nit))
            {
                pasado = false;
                mensajeError += "\nNIT";
            } if (string.IsNullOrEmpty(nombre))
            {
                pasado = false;
                mensajeError += "\nNombre";
            }
            if (string.IsNullOrEmpty(fijo) || string.IsNullOrEmpty(celular))
            {
                pasado = false;
                mensajeError += "\nUn número telefónico";
            }
            if(!pasado)
            {
                return new { Correcto = false, Mensaje="Debe llenar los siguientes campos:"+mensajeError };
            }

            if (esNuevo)
            {
                perfil = new Perfil()
                                 {
                                     Apellido = apellidos,
                                     Celular = celular,
                                     DUI = dui,
                                     EsCliente = true,
                                     IdUsuario = SesionUsuario.UsuarioSesion.IdUsuario??0,
                                     NIT = nit,
                                     Nombre = nombre,
                                     Otros = otros,
                                     Telefono = fijo
                                 };
                repository.Add(perfil);
                var cliente = new Cliente()
                                  {
                                      IdPerfil = perfil.Id
                                  };
                repository.Add(cliente);
            }
            else
            {
                perfil = repository.Single<Perfil>(SesionUsuario.UsuarioSesion.IdPerfil);
                perfil.Apellido = apellidos;
                perfil.Celular = celular;
                perfil.DUI = dui;
                perfil.NIT = nit;
                perfil.Nombre = nombre;
                perfil.Otros = otros;
                perfil.Telefono = fijo;
                repository.Update(perfil);
            }
            SesionUsuario.UsuarioSesion.IdPerfil = perfil.Id;
            return new { Correcto = true, IdPerfil = perfil.Id, Mensaje = "El perfil se ha guardado exitosamente" };
        }
        catch(Exception ex)
        {
            return new {Correcto = false,Mensaje="Ha ocurrido un error:\n"+ex.Message};
        }

    }
    #region Funciones Cuenta
    [WebMethod]
    public static object ObtenerDatosCuenta(int idCuenta)
    {
        try
        {
            var cuenta = repository.Single<Cuenta>(idCuenta);
            var tipoCuenta = "";
            switch (cuenta.TipoCuenta)
            {
                case 0:
                    tipoCuenta = "No aplica";
                    break;
                case 1:
                    tipoCuenta = "Corriente";
                    break;
                case 2:
                    tipoCuenta = "Ahorro";
                    break;
                case 3:
                    tipoCuenta = "Otros";
                    break;
            }

            var tipoTarjeta = "";
            switch (cuenta.TipoTarjeta)
            {
                case 0:
                    tipoTarjeta = "No aplica";
                    break;
                case 1:
                    tipoTarjeta = "Credito";
                    break;
                case 2:
                    tipoTarjeta = "Debito";
                    break;
                case 3:
                    tipoTarjeta = "Otros";
                    break;
            }
            return new
                       {
                           cuenta.NCuenta,
                           cuenta.EsTarjeta,
                           cuenta.Nombre,
                           TipoCuenta = tipoCuenta,
                           TipoTarjeta=tipoTarjeta,
                           Correcto=true
                       };
        }
        catch(Exception ex)
        {
            return new {Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message};
        }

    }

    [WebMethod]
    public static object ObtenerDatosCuentaEditar(int idCuenta)
    {
        try
        {
            var cuenta = repository.Single<Cuenta>(idCuenta);
            return new
            {
                cuenta.NCuenta,
                cuenta.EsTarjeta,
                cuenta.Nombre,
                cuenta.TipoCuenta,
                cuenta.TipoTarjeta,
                Correcto = true
            };
        }
        catch (Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }

    }

    [WebMethod]
    public static object CrearCuenta(int idCuenta, string nombreCuenta, string nCuenta, int tipoCuenta, bool esTarjeta, int tipoTarjeta)
    {
        try
        {
            Cuenta cuenta;
            var cliente = repository.Single<Cliente>(x => x.IdPerfil == SesionUsuario.UsuarioSesion.IdPerfil);
            if (idCuenta == 0)
            {
               cuenta = new Cuenta()
                                 {
                                     EsTarjeta = esTarjeta,
                                     IdCliente = cliente.Id,
                                     NCuenta = nCuenta,
                                     Nombre = nombreCuenta,
                                     TipoCuenta = tipoTarjeta,
                                     TipoTarjeta = tipoTarjeta
                                 };
                repository.Add(cuenta);
            }
            else
            {
                cuenta = repository.Single<Cuenta>(idCuenta);
                cuenta.NCuenta = nCuenta;
                cuenta.Nombre = nombreCuenta;
                cuenta.TipoCuenta = tipoCuenta;
                cuenta.TipoTarjeta = tipoTarjeta;
                repository.Update(cuenta);
            }
            return new {Correcto = true, IdCuenta = cuenta.Id};
            
        }
        catch(Exception ex)
        {
            return new {Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message};
        }
    }

    [WebMethod]
    public static object EliminarCuenta(int idCuenta)
    {
        try
        {
            var cuenta = repository.Single<Cuenta>(idCuenta);
            var nombreCuenta = cuenta.Nombre;
            repository.Delete<Cuenta>(idCuenta);
            return new { Correcto = true, Mensaje = "La cuenta " + nombreCuenta + " ha sido eliminada"};
        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }
    #endregion

    #region Metodos Direcciones
    [WebMethod]
    public static object CrearEditarDireccion(int idDireccion, string nombreDireccion, string colonia, string calle, string complemento, int idMunicipio)
    {
        try
        {
            DireccionCliente direccionCliente;
            if(idDireccion==0)
            {
                var cliente = repository.Single<Cliente>(x => x.IdPerfil == SesionUsuario.UsuarioSesion.IdPerfil);
                direccionCliente=new DireccionCliente()
                                     {
                                         Calle = calle,
                                         Colonia = colonia,
                                         Complemento = complemento,
                                         IdCliente = cliente.Id,
                                         IdMunicipio = idMunicipio,
                                         Nombre = nombreDireccion
                                     };
                repository.Add(direccionCliente);
            }
            else
            {
                direccionCliente = repository.Single<DireccionCliente>(idDireccion);
                direccionCliente.Calle = calle;
                direccionCliente.Colonia = colonia;
                direccionCliente.Complemento = complemento;
                direccionCliente.IdMunicipio = idMunicipio;
                direccionCliente.Nombre = nombreDireccion;
                repository.Update(direccionCliente);
            }
            return new {Correcto = true, idDireccionCliente = direccionCliente.Id};
        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }

    [WebMethod]
    public static object ObtenerMunicipiosDepto(int idDepartamento)
    {
        try
        {
            var municipios = from m in repository.Find<Municipio>(x => x.IdDepartamento == idDepartamento)
                             select m;
            return new {Correcto = true, municipios};

        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }

    [WebMethod]
    public static object ObtenerDepartamentos()
    {
        try
        {
            var departamentos = from d in repository.All<Departamento>()
                                select d;
            return new {Correcto = true, departamentos};
        }
        catch(Exception ex)
        {
            
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }

    [WebMethod]
    public static object ObtenerDireccion(int idDireccion)
    {
        try
        {
            var direccion = repository.Single<DireccionCliente>(idDireccion);
            var municipio = repository.Single<Municipio>(direccion.IdMunicipio);
            return new
                       {
                           direccion.Calle,
                           direccion.Colonia,
                           direccion.Complemento,
                           direccion.IdMunicipio,
                           direccion.Nombre,
                           municipio.IdDepartamento,
                           Correcto=true
                       };
        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }

    [WebMethod]
    public static object EliminarDireccion(int idDireccion)
    {
        try
        {
            repository.Delete<DireccionCliente>(idDireccion);
            return new {Correcto = true};
        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }
    #endregion



    protected void HacessrNada(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}
